package com.naiterui.common.repository.hibernate;

import java.io.Serializable;
import java.util.List;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria;

import com.naiterui.common.repository.page.Page;

/**
 * 持久层增强操作封装
 * 定义基于锁、DetachedCriteria、Criterion的查询接口
 * @author zhouyanxin
 * @since 1.0.0
 */
public interface IEntityDao<T, ID extends Serializable> extends IGenericDao<T, ID> {

    /**
     * 加载全部对象
     * 注意该方法的使用范围应该主要针对字典表或配置表
     * IGenericDao.loadAll()
     * @author zhouyanxin
     * @datT 2018年5月11日
     * @sincT 1.0.0
     * @return
     */
    List<T> loadAll();

    /**
     * 使用锁的HQL查询
     * 内部使用的更新锁
     * IEnhanceDao.findByLock()
     * @author zhouyanxin
     * @date 2018年5月11日
     * @since 1.0.0
     * @param hql
     * @param values
     * @return
     */
    List<T> findByLock(String hql, Object... values);

    /**
     * 创建DetachedCriteria
     * IEnhanceDao.createDetachedCriteria()
     * @author zhouyanxin
     * @date 2018年5月11日
     * @since 1.0.0
     * @return
     */
    DetachedCriteria createDetachedCriteria();

    /**
     * 标准的基于DetachedCriteria的查询
     * IEnhanceDao.findByCriteria()
     * @author zhouyanxin
     * @date 2018年5月11日
     * @since 1.0.0
     * @param criteria
     * @return
     */
    List<T> findByCriteria(DetachedCriteria criteria);

    /**
     * 基于DetachedCriteria的查询
     * 获取唯一对象
     * IEnhanceDao.findByCriteriaUnique()
     * @author zhouyanxin
     * @date 2018年5月11日
     * @since 1.0.0
     * @param criteria
     * @return
     */
    T findByCriteriaUnique(DetachedCriteria criteria);

    /**
     * 基于DetachedCriteria的分页查询
     * IEnhanceDao.pagedQuery()
     * @author zhouyanxin
     * @date 2018年5月11日
     * @since 1.0.0
     * @param pageNo 当前页
     * @param pageSize 每页显示记录数
     * @param detachedCriteria
     * @return
     */
    Page<T> pagedQuery(int pageNo, int pageSize, DetachedCriteria detachedCriteria);

    /**
     * 支持动态条件Criterion的分页查询
     * IEnhanceDao.pagedQuery()
     * @author zhouyanxin
     * @date 2018年5月11日
     * @since 1.0.0
     * @param pageNo 当前页
     * @param pageSize 每页显示记录数
     * @param criterions
     * @return
     */
    @Deprecated
    Page<T> pagedQuery(int pageNo, int pageSize, Criterion... criterions);
}
